package cn.cocho.android.mc.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

import cn.cocho.android.mc.character.StringUtils;
import cn.cocho.android.mc.log.LoggerUtils;
import cn.cocho.android.mc.util.CommonContexts;
import cn.cocho.android.mc.util.CommonSigns;

/**
 * 文件操作
 * 
 * @author HAIKANG SONG
 * @time 2013-4-18下午1:28:27
 */
public class FileUtils {

	/**
	 * 创建文件,如果文件的目录不存在则会自动创建
	 * 
	 * @param filePath
	 *            文件的路径
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午3:10:34
	 */
	public static boolean createFile(String filePath) {
		boolean result = false;
		File file = new File(filePath);
		try {
			mkdirs(file.getParent());
			file.createNewFile();
			result = true;
		} catch (Exception e) {
			LoggerUtils.error(FileUtils.class.getName(), "创建文件[" + filePath + "]时出错", e);
		}
		return result;
	}

	/**
	 * 将信息写入指定的文件
	 * 
	 * @param filePath
	 *            文件路径
	 * @param content
	 *            信息内容
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-19下午3:25:39
	 */
	public static boolean writeFile(String filePath, String content) {
		boolean result = false;
		FileOutputStream out = null;
		try {
			File file = getFile(filePath);
			out = new FileOutputStream(file);
			out.write(content.getBytes(CommonContexts.encode));
			result = true;
		} catch (Exception e) {
			LoggerUtils.error(FileUtils.class.getName(), "将信息[" + content + "]写入[" + filePath + "]中出错", e);
		} finally {
			try {
				if (out != null) {
					out.flush();
					out.close();
				}
			} catch (Exception e) {
			}
		}
		return result;
	}

	/**
	 * 读取指定路径下的文件内容
	 * 
	 * @param filePath
	 *            文件路径（绝对路径）
	 * @return 字符串类型的文件内容
	 * @author HAIKANG SONG
	 * @time 2013-5-6下午5:47:48
	 */
	public static String readFile(String filePath) {
		File file = new File(filePath);
		if (!file.exists()) {
			return null;
		}
		StringBuffer sb = new StringBuffer();
		InputStreamReader in = null;
		BufferedReader br = null;
		try {
			in = new InputStreamReader(new FileInputStream(file), CommonContexts.encode);
			br = new BufferedReader(in);
			String line = br.readLine();
			while (line != null) {
				sb.append(line);
				line = br.readLine();
			}
		} catch (Exception e) {
			LoggerUtils.error(FileUtils.class.getName(), "读取文件[" + filePath + "]时出错", e);
		} finally {
			try {
				if (in != null) {
					in.close();
				}
				if (br != null) {
					br.close();
				}
			} catch (Exception e) {
			}
		}
		return sb.toString();
	}

	/**
	 * 将信息追加到指定的文件里面
	 * 
	 * @param filePath
	 *            文件路径
	 * @param content
	 *            信息内容
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-19下午3:26:50
	 */
	public static boolean appendFile(String filePath, String content) {
		boolean result = false;
		RandomAccessFile ran = null;
		try {
			File file = getFile(filePath);
			ran = new RandomAccessFile(file, "rw");
			ran.seek(ran.length());// 将指针定位到文件最后，即“追加”
			ran.write((CommonSigns.NEWLINE + content).getBytes(CommonContexts.encode));
			result = true;
		} catch (Exception e) {
			LoggerUtils.error(FileUtils.class.getName(), "将信息[" + content + "]追加写入[" + filePath + "]中出错", e);
		} finally {
			try {
				if (ran != null) {
					ran.close();
				}
			} catch (Exception e) {
			}
		}
		return result;
	}

	/**
	 * 创建目录，如果父目录不存在会自动创建
	 * 
	 * @param dirPath
	 *            目录路径
	 * 
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午3:30:51
	 */
	public static void mkdirs(String dirPath) {
		if (StringUtils.isNotBlank(dirPath)) {
			File file = new File(dirPath);
			if (!file.exists()) {
				file.mkdirs();
			}
		}
	}

	/**
	 * 剪切文件
	 * 
	 * @param sourceFilePath
	 *            被剪切的文件
	 * @param targetFilePath
	 *            要移动到的文件位置
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午4:16:55
	 */
	public static boolean removeFile(String sourceFilePath, String targetFilePath) {
		boolean bool = true;
		File sourceFile = new File(sourceFilePath);
		File targetFile = getFile(targetFilePath);
		if (!sourceFile.isFile()) {
			bool = false;
		} else {// 如果目标路径的文件是文件那么进行剪切
			sourceFile.renameTo(targetFile);
			if (!targetFile.isFile()) {// 如果剪切后目标位置没有文件则剪切失败
				bool = false;
			}
		}
		return bool;
	}

	/**
	 * * 重命名文件
	 * 
	 * @param filePath
	 *            文件路径
	 * @param name
	 *            新的文件名称
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午4:59:49
	 */
	public static boolean rnameFile(String filePath, String name) {
		boolean bool = true;
		File oldFile = new File(filePath);
		File newFile = new File(oldFile.getParent() + File.separator + name);
		if (oldFile.isFile()) {
			oldFile.renameTo(newFile);
		} else {
			bool = false;
		}
		return bool;
	}

	/**
	 * 判断指定路径的文件或目录是否存在
	 * 
	 * @param path
	 *            文件或目录路径
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午5:07:34
	 */
	public static boolean isExists(String path) {
		return new File(path).exists();
	}

	/**
	 * 删除文件或目录
	 * 
	 * @param path
	 *            文件或目录路径
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午5:38:56
	 */
	public static void delete(String path) {
		File file = new File(path);
		delete(file);
	}

	/**
	 * 删除文件或目录
	 * 
	 * @param path
	 *            文件或目录路径的File对象
	 * @author yzl
	 * @time 2013-5-3上午11:39:16
	 */
	public static void delete(File path) {
		if (!path.exists())
			return;
		if (path.isFile()) {
			path.delete();
			return;
		}
		File[] files = path.listFiles();
		for (int i = 0; i < files.length; i++) {
			delete(files[i]);
		}
		path.delete();
	}

	/**
	 * 复制单个文件
	 * 
	 * @param sourceFilePath
	 *            被复制的文件
	 * @param targetFilePath
	 *            要复制到的文件位置
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午4:16:55
	 */
	public static boolean copyFile(String sourceFilePath, String targetFilePath) {
		boolean bool = false;
		InputStream in = null;
		FileOutputStream out = null;
		try {
			File sourceFile = new File(sourceFilePath);
			if (sourceFile.exists()) {
				in = new FileInputStream(sourceFilePath);
				File targetFile = getFile(targetFilePath);
				out = new FileOutputStream(targetFile);
				byte[] buffer = new byte[CommonContexts.fileBuffer];
				int byteread = 0;
				while ((byteread = in.read(buffer)) != -1) {
					out.write(buffer, 0, byteread);
				}
				bool = true;
			}

		} catch (Exception e) {
			LoggerUtils.error(FileUtils.class.getName(), "将文件[" + sourceFilePath + "]复制到[" + targetFilePath + "]时出错", e);
			bool = false;
		} finally {
			try {
				if (in != null)
					in.close();
				if (out != null) {
					out.flush();
					out.close();
				}
			} catch (Exception e) {
			}
		}
		return bool;
	}

	/**
	 * 复制整个文件夹内容
	 * 
	 * @param sourceDirPath
	 *            源文件路径
	 * @param targetDirPath
	 *            目标路径
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午6:25:55
	 */
	public static void copyDir(String sourceDirPath, String targetDirPath) {
		mkdirs(targetDirPath); // 如果文件夹不存在 则建立新文件夹
		File sourceFolder = new File(sourceDirPath);
		String[] files = sourceFolder.list();
		File temp = null;
		for (int i = 0; i < files.length; i++) {
			if (sourceDirPath.endsWith(File.separator)) {
				temp = new File(sourceDirPath + files[i]);
			} else {
				temp = new File(sourceDirPath + File.separator + files[i]);
			}

			if (temp.isFile()) {
				FileInputStream fin = null;
				FileOutputStream fout = null;
				try {
					fin = new FileInputStream(temp);
					fout = new FileOutputStream(targetDirPath + File.separator + (temp.getName()).toString());
					byte[] buffer = new byte[CommonContexts.fileBuffer];
					int len;
					while ((len = fin.read(buffer)) != -1) {
						fout.write(buffer, 0, len);
					}
				} catch (FileNotFoundException e) {
					LoggerUtils.error(FileUtils.class.getName(), "将文件[" + sourceDirPath + "]里面的文件复制到[" + targetDirPath + "]时出错", e);
				} catch (IOException e) {
					LoggerUtils.error(FileUtils.class.getName(), "将文件[" + sourceDirPath + "]里面的文件复制到[" + targetDirPath + "]时出错", e);
				}

				try {
					if (fout != null) {
						fout.flush();
						fout.close();
					}
					if (fin != null) {
						fin.close();
					}
				} catch (Exception e) {
				}
			}
			if (temp.isDirectory()) {// 如果是子文件夹
				copyDir(sourceDirPath + File.separator + files[i], targetDirPath + File.separator + files[i]);
			}
		}

	}

	/**
	 * 根据文件路径获得文件对象，如果文件父目录不存在则自动创建
	 * 
	 * @param filePath
	 *            文件路径
	 * @return
	 * @author HAIKANG SONG
	 * @time 2013-4-18下午4:49:45
	 */
	public static File getFile(String filePath) {
		File file = new File(filePath);
		mkdirs(file.getParent());
		return file;
	}

	/**
	 * Java文件操作 获取文件扩展名
	 * 
	 * @param filename
	 * @return
	 * @return String
	 * @author hsx
	 * @time 2013-8-30上午11:02:46
	 */
	public static String getExtensionName(String filename) {
		if ((filename != null) && (filename.length() > 0)) {
			int dot = filename.lastIndexOf('.');
			if ((dot > -1) && (dot < (filename.length() - 1))) {
				return filename.substring(dot + 1);
			}
		}
		return filename;
	}

	/**
	 * Java文件操作 获取不带扩展名的文件名
	 * 
	 * @param filename
	 * @return
	 * @return String
	 * @author hsx
	 * @time 2013-8-30上午11:02:35
	 */
	public static String getFileNameNoEx(String filename) {
		if ((filename != null) && (filename.length() > 0)) {
			int dot = filename.lastIndexOf('.');
			if ((dot > -1) && (dot < (filename.length()))) {
				return filename.substring(0, dot + 1);
			}
		}
		return filename;
	}

}
